let user = { name: "john", age: 30 };

// 方式1：in 操作符（检查原型链）
if ("name" in user) {
  console.log("✅ 属性存在（可能来自原型链）");
}

// 方式2：hasOwnProperty（仅检查自身属性）
if (user.hasOwnProperty("name")) {
  console.log("✅ 自身属性存在");
}

// 方式3：undefined 判断（可能有误判）
if (user.name !== undefined) {
  console.log("❌ 不可靠的方式（当属性值为 undefined 时会误判）");
}

// 方式4：Object.hasOwn（ES2022+，推荐方式）
if (Object.hasOwn(user, "name")) {
  console.log("✅ 现代方式检查自身属性");
}

// 方式5：Reflect.has()
if (Reflect.has(user, "name")) {
  console.log("Reflect.has 和 in 运算符等效");
}

// Object.keys().includes()
if (Object.keys(user).includes("name")) {
  console.log(`✅ Object.keys().includes()`);
}

const obj = {
  asyncMethod() {
    setTimeout(function () {
      console.log(this); // 普通函数调用 => undefined (严格模式)
    }, 0);

    setTimeout(() => {
      console.log(this); // 箭头函数 => 正确指向obj
    }, 0);
  },
};

obj.asyncMethod();

const ob1 = {
  [Symbol.toPrimitive]: function (hint) {
    if (hint === "string") {
      return "Hello";
    }

    console.log("hint: ", hint); // number
    return 123;
  },
};

console.log(ob1 + "23");

// 输入是以数字组成的数组，找出所有项的和最大的 arr 数组的连续子数组。
// 编写一个函数 getMaxSubSum(arr)，该函数返回 arr 数组的最大子数组的和。

function getMaxSubSum(arr) {
  let maxSum = 0;
  let partialSum = 0;

  for (const num of arr) {
    partialSum += num;
    maxSum = Math.max(partialSum, maxSum);
    if (partialSum < 0) partialSum = 0;
  }

  return maxSum;
}

console.log(getMaxSubSum([-1, 2, 3, -9]));
console.log(getMaxSubSum([-1, 2, 3, -9, 11]));
console.log(getMaxSubSum([-2, -1, 1, 2]));
console.log(getMaxSubSum([100, -9, 2, -3, 5]));
console.log(getMaxSubSum([1, 2, 3]));
